package com.hk.service.sys;

import java.math.BigInteger;
import java.util.List;

import com.hk.commons.HqlFilter;
import com.hk.commons.SqlFilter;
import com.hk.commons.entity.AccountBalance;
import com.hk.commons.entity.Organization;
import com.hk.commons.entity.sys.SysUser;
import com.hk.commons.entity.sys.SysUserDummy;
import com.hk.commons.vo.CheckInfo;
import com.hk.commons.vo.app.SysUserMsg;

public interface ISysUser {

	/** 更改用户信息，并保存日志 */
	public void update(SysUser user, Long actUserId);
	
	/** 根据id获实体 */
	public SysUser findById(Long id);

	public SysUser getByMobileId(String mobileId);

	public SysUserDummy findDummyById(Long id);

	/** 分页获取 */
	public List<SysUser> find(int pageNum, int pageSize);

	/** 保存 */
	public Long add(SysUser o);

	public SysUser delete(Long id);

	public Boolean isTester(Long userId);

	public SysUserMsg getRespUser(Long userId);

	/**
	 * 获取全部的用户
	 * 
	 * @return
	 */
	public List<SysUser> getAll();

	/**
	 * 根据部门id 获取该部门下所有的用户
	 * 
	 * @param orgID
	 * @return
	 */
	public List<SysUser> getUserByOrgId(Integer orgID);

	/**
	 * 根据推荐码获取用户
	 * 
	 * @param recommendCode
	 * @return
	 */
	public List<SysUser> getUserByRecommendCode(String recommendCode);

	/**
	 * 根据真实姓名获取用户
	 * 
	 * @param realName
	 * @return
	 */
	public SysUser getUserByRealName(String realName);

	public List<SysUser> getUserListByRealName(String realName);

	public List<SysUser> findByFilter(HqlFilter hqlFilter);

	public List<SysUser> findByFilter(HqlFilter hqlFilter, int pageNum,
			int pageSize);

	public Long countByFilter(HqlFilter hqlFilter);

	public void update(SysUser sysUser);

	public boolean existById(Long id);

	public boolean existByName(String name);

	public boolean existByMobileId(String mobileId);

	/**
	 * 账号查询用户
	 * 
	 * @param account
	 *            系统用户帐户
	 * @return
	 */
	public SysUser getByAccount(String account);

	public SysUserDummy getDummyByAccount(String account);

	public List<SysUser> findBySqlFilter(SqlFilter sqlFilter);

	public List<SysUser> findBySqlFilter(SqlFilter sqlFilter, int page, int rows);

	public BigInteger countBySqlFilter(SqlFilter sqlFilter);

	/**
	 * 根据accountId 获取用户
	 * 
	 * @param accountId
	 * @return
	 */
	public SysUser getByAccountId(String accountId);

	/**
	 * 根据phoneNum 获取用户
	 * 
	 * @param phoneNum
	 * @return
	 */
	public SysUser getByPhoneNum(String phoneNum);

	/**
	 * 根据phoneNum 获取用户
	 * @param phoneNum
	 * @param closeAccount 销户状态（0：末销户，1：已销户）
	 * @return
	 */
	SysUser getByPhoneNum(String phoneNum,Integer closeAccount);

	/**
	 * 通过id 获取用户名
	 * 
	 * @param id
	 * @return
	 */
	public String getNameById(Long id);

	/**
	 * 
	 * 根据用户的支付方式反向更新用户的身份信息
	 *
	 * @return
	 */
	public void upUserByPayment(SysUser req);

	/**
	 * 设置用户的绑卡信息为已支付
	 */
	public void upUserByPayment(Long userId, String accountId, String identity,
			String accountName);

	/**
	 * 检查用户id 长度
	 * 
	 * @param id
	 * @return
	 */
	public Long checkId(Long id);

	/**
	 * 根据用户id ,获取理财师id, 理财师不存在时则返回null
	 * 
	 * @param userId
	 * @return
	 */
	public Long getFinUserIdByUserId(Long userId);

	/**
	 * 根据用户id ,获取理财师实体, 理财师不存在时则返回null
	 *
	 * @param userId
	 * @return
	 */
	public SysUser findFinUserByUserId(Long userId);

	/**
	 * 根据用户id ,获取推荐人数目
	 * 
	 * @param userId
	 * @return
	 */
	public Integer getRelUserNumById(Long userId);

	/**
	 * 根据用户id ,判断用户是否为理财师，如果是则返回真，否则为false
	 * 
	 * @param userId
	 * @return
	 */
	public Boolean isFinUserById(Long userId);

	/**
	 * 根据用户phoneNum ,判断用户是否为理财师，如果是则返回真，否则为false
	 * 
	 * @param
	 * @return
	 */
	public Boolean isFinUserByPhoneNum(String phoneNum);

	/**
	 * 重设该推荐码下所有客户的推荐码为空
	 * 
	 * @param recommandCode
	 * @return
	 */
	public Boolean cleanRecommandCordByCode(String recommandCode, Long actUserId);


	/**
	 * 重设该推荐码下所有客户的组织架构
	 *
	 * @param recommandCode
	 * @return
	 */
	public Boolean reSetOrgByCode(String recommandCode, Long actUserId);

	/**
	 * 判断是否为理财师
	 * 
	 * @param
	 * @return
	 */
	public Boolean checkFinancialFlanners(SysUser user);


	public void update(SysUser user, Long actUserId, Integer logType);


    /**
	 * 更改用户推荐码
	 * @param recommandCode
	 * @param userId
	 * @param actUserId
     */
	public CheckInfo updateRecommandCode(String recommandCode, Long userId, Long actUserId);;


	/**
	 * 更改用户组织架构
	 * @param org
	 * @param user
	 * @param actUserId
	 */
	public CheckInfo updateUserOrgId(Organization org, SysUser user, Long actUserId);

	/**
	 *
	 * @param org
	 * @param userId
	 * @param actUserId
	 * @param chgCustomer 是否关联修改客户：1-修改， 0-不修改
     * @return
     */
	public CheckInfo updateOrgId(Organization org, Long userId, Long actUserId, Integer chgCustomer);

	/**
	 * 获取绑卡客户数
	 * @param userId
	 * @return
     */
	public Integer getRelTieCardUserNumById(Long userId);

	/**
	 * 获取账户余额
	 * @param userId
	 * @return
	 */
	AccountBalance getBalance(Long userId);

	/**
	 * 使用场景：
	 * 1：用户注册送加息券
	 * 2：无主客户变更为有主客户赠送加息券
	 *
	 * 注意：
	 * 该加息券一个用户只送一张
	 *
	 * @param userId
	 * @return
     */
	CheckInfo checkAndSendRegistCard(Long userId);


	/**
	 * 判断是否需要赠送加息券
	 * @param userId
	 * @return
     */
	public boolean checkNeedSendRegistCard(Long userId);

}
